#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>

//验证下，父进程关闭读段，子进程是否会信号终止，具体是什么信号
int main()
{
  int pip_fd[2];
  if(pipe(pip_fd))
  {
    perror("pipe");
    return -1;
  }

  pid_t pid=fork();
  if(pid<0)
  {
    perror("fork");
    return -1;
  }
  else if(pid==0)
  {
    //child
    close(pip_fd[0]);
    const char* s="hello ,father,now,acess pipe";
    int i=20;
    while(i)
    {
      write(pip_fd[1],s,strlen(s));
      sleep(1);
      i--;
    }
  }
  else{
    //father
    close(pip_fd[1]);
    char fbuffer[124]={0};
    int i=5;
    while(i)
    {
      int s= read(pip_fd[0],fbuffer,sizeof(fbuffer));
      fbuffer[s]=0;
      printf("this from father :%s\n",fbuffer);
      sleep(1);
      i--;
    }
    //这个时候关闭父进程的读段，意味不需要读取了
    close(pip_fd[0]);
    //逻辑上一定比子进程先结束
    int status;
    wait(&status);
    if(WIFEXITED(status))
    {
      //正常退出
      printf("exit code:%d\n",WEXITSTATUS(status));
    }
    else{
      //异常退出
      printf("singal is : %d\n",status&0X7F);
    }
  }
  return 0;
}


//int main()
//{
//  // int * pipe_fd=NULL;  这样定义是错误的
//  int pipe_fd[2];
//  //创建管道
//  if(pipe(pipe_fd))     //系统调用接口，OS维护
//  {
//    perror("pipe");
//    return -1;
//  }
//  
//  pid_t pid=fork();
//  if(pid<0)
//  {
//    perror("fork");
//    return -1;
//  }
//  else if(pid==0)
//  {
//    //child
//    
//    close(pipe_fd[0]);  //关闭子进程的读端，让子进程写入
//    char sinbuffer[124]={0};
//    //从键盘获取数据一直写入
//    while(1)
//    {
//      //从键盘读数据
//      int s= read(0,sinbuffer,sizeof(sinbuffer));
//      sinbuffer[s]=0;
//      //读到的数据写入到管道中
//      write(pipe_fd[1],sinbuffer,s);   //write(pipe_fd[1],sinbuffer,strlen(sinbuffer))
//
//    }
//  }
//  else{
//    //father
//    close(pipe_fd[1]);  //关闭父进程的写端，让父进程读取
//
//    char buffer[124]={0};
//    //从管道一直读取数据
//    while(1)
//    {
//      //pipe读取
//      int s= read(pipe_fd[0],buffer,sizeof(buffer));
//      buffer[s]=0;
//      //打印到stdout
//      write(1,buffer,s);
//    }
//
//  }
//  return 0;
//}
